package ar.fiuba.tp7552.buildadmin.webactions.planes;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;

import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.builds.Propiedad;
import ar.fiuba.tp7552.buildadmin.model.builds.Responsable;
import ar.fiuba.tp7552.buildadmin.model.expensas.TipoExpensa;
import ar.fiuba.tp7552.buildadmin.service.EdificioService;
import ar.fiuba.tp7552.buildadmin.service.PlanService;
import ar.fiuba.tp7552.buildadmin.service.PropiedadService;
import ar.fiuba.tp7552.buildadmin.service.ResponsableService;
import ar.fiuba.tp7552.buildadmin.webactions.BaseAction;

import com.opensymphony.xwork2.Preparable;

public class GenerarPlanAction extends BaseAction implements Preparable {
	
	private EdificioService edificioService;
	private ResponsableService resposableService;
	private PropiedadService propiedadService;
	private PlanService planService;
	private Edificio edificio;
	private BigDecimal monto;
	private Integer cuotas;
	private Date fecha;
	TipoExpensa tipoExpensas;
	
	private Responsable responsable;
	private Propiedad[] seleccionadas;
	
	private Collection<Propiedad> props;
	
	/*
	 * @param responsable responsable de las propiedades del edificio.
	 * @param seleccionadas 
	 * @param fecha
	 * @param monto
	 * @param tipoExpensa
	 * @param cuotas
	 * @throws BusinessException si no se especifica por lo menos una propiedad.
	 *  
	 */
	// ~~ Constructor ====================================================
	
	public GenerarPlanAction(PlanService planService, EdificioService edificioService, 
			ResponsableService resposableService, PropiedadService propiedadService) {
		super();
		this.planService = planService;
		this.propiedadService = propiedadService;
		this.edificioService = edificioService;
		this.resposableService=resposableService;
	}
	

	// ~~ Actions ========================================================
	@Override
	public void prepare() {
		if (responsable != null && responsable.getId()!=null) {
			responsable = resposableService.get(responsable.getId());
		}
		for (int i = 0; i < seleccionadas.length; i++) {
			if (seleccionadas[i] != null && seleccionadas[i].getId()!=null) {
				seleccionadas[i] = propiedadService.get(seleccionadas[i].getId());
			}
		}
		props = Arrays.asList(seleccionadas);
	}
	
	public String generar() {
		try {
			planService.createPlan(responsable, props, fecha, monto, tipoExpensas, cuotas);
			return BaseAction.SUCCESS;
		} catch (BusinessException e) {
			this.addActionError(e.getMessage());
			return BaseAction.INPUT;
		}
	}	
	
	//--------------------------Getters&Setters
	
	public Responsable getResponsable() {
		return responsable;
	}
	public void setResponsable(Responsable responsable) {
		this.responsable = responsable;
	}
	public Collection<Edificio> getEdificios()  {
		return edificioService.getAll();
	}
	public Collection<Responsable> getResponsables()  {
		return resposableService.getAll();
	}
	public Propiedad[] getSeleccionadas() {
		return seleccionadas;
	}
	public void setSeleccionadas(Propiedad[] seleccionadas) {
		this.seleccionadas = seleccionadas;
	}
	public Collection<Propiedad> getPropiedades() {
		return propiedadService.findPropiedades(edificio, responsable);
	}
	public void setEdificio(Edificio edificio) {
		this.edificio = edificio;
	}
	public Edificio getEdificio() {
		return edificio;
	}
	public BigDecimal getMonto() {
		return monto;
	}
	public void setMonto(BigDecimal monto) {
		this.monto = monto;
	}
	public Integer getCuotas() {
		return cuotas;
	}
	public void setCuotas(Integer cuotas) {
		this.cuotas = cuotas;
	}
	public Date getFecha() {
		return fecha;
	}
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	public TipoExpensa getTipoExpensas() {
		return tipoExpensas;
	}
	public void setTipoExpensas(TipoExpensa tipoExpensas) {
		this.tipoExpensas = tipoExpensas;
	}
}